package com.ftf.tp.blog.application.dto.command;

import com.ftf.tp.blog.domain.article.aggregate.ArticleAgg;
import com.ftf.tp.common.constants.ArticleStatusEnum;
import com.ftf.tp.blog.domain.article.dos.ArticleDataDO;
import com.ftf.tp.blog.domain.article.valobj.ColumnValue;
import com.ftf.tp.blog.domain.article.valobj.TagValue;
import com.ftf.tp.blog.application.assembler.ColumnAssembler;
import com.ftf.tp.blog.application.assembler.TagAssembler;
import com.ftf.tp.blog.application.dto.ColumnDTO;
import com.ftf.tp.blog.application.dto.TagDTO;
import com.ftf.tp.common.core.constants.CommonConstant;
import com.ftf.tp.common.core.utils.ConverterUtil;
import com.ftf.tp.common.core.utils.SnowIdUtils;
import com.ftf.tp.common.cqrs.annotation.Command;
import com.ftf.tp.user.client.dto.UserInfoDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;

import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.List;

/**
 * 新建文章参数
 *
 * @author tanghao
 * @date 2021/11/15
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Command
@ApiModel("新建文章参数")
public class PublishArticleCommand implements Serializable {

    /**
     * 文章标题
     */
    @NotEmpty(message = "请填写文章标题")
    @Length(min = 4, max = 60, message = "标题长度在4到60之间")
    @ApiModelProperty("文章标题")
    private String articleTitle;

    /**
     * 文章内容html
     */
    @ApiModelProperty("文章内容html")
    private String articleContentHtml;

    /**
     * 文章内容markdown
     */
    @ApiModelProperty("文章内容markdown")
    @NotEmpty(message = "正文至少输入10个字")
    @Length(min = 10, message = "正文至少输入10个字")
    private String articleContentMarkdown;

    /**
     * 文章摘要
     */
    @ApiModelProperty("文章摘要")
    @NotEmpty(message = "摘要不能为空")
    private String articleAbstract;

    /**
     * 文章封面
     */
    @ApiModelProperty("文章封面")
    private String articleCover;

    /**
     * 文章发布状态（1:公开，2:私密，3:仅粉丝可见)
     */
    @ApiModelProperty("文章发布状态（1:公开，2:私密，3:仅粉丝可见)")
    @NotNull(message = "请选择文章是否公开")
    private Integer articlePublishStatus;

    /**
     * 文章类型 (0:原创，1:转载)
     */
    @ApiModelProperty("文章类型 (0:原创，1:转载)")
    @NotNull(message = "请选择文章是原创还是转载")
    private Integer articleType;

    /**
     * 文章状态 (10:草稿，20:笔记，30:审核中，40:已发布 ,50:被举报，60:已封，个位数为1时代表处于垃圾箱状态);
     */
    @ApiModelProperty("文章状态 (10:草稿，20:笔记，30:审核中，40:已发布 ,50:被举报，60:已封，个位数为1时代表处于垃圾箱状态);")
    private Integer articleStatus;

    /**
     * 文章是否开启评论 (0:可评论，1:不可评论);
     */
    @ApiModelProperty("文章是否开启评论 (0:可评论，1:不可评论);")
    @NotNull(message = "请选择文章是否可评论")
    private Integer commentStatus;

    /**
     * 文章标签信息
     */
    @Valid
    @ApiModelProperty("文章标签信息")
    private List<TagDTO> tagDTOList;

    /**
     * 文章专栏信息
     */
    @Valid
    @ApiModelProperty("文章专栏信息")
    private List<ColumnDTO> columnDTOList;


    public ArticleAgg doForward(UserInfoDTO currentUser) {
        ArticleAgg articleAgg = new ArticleAgg();
        articleAgg.setId(SnowIdUtils.uniqueLong());
        articleAgg.setArticleStatus(ArticleStatusEnum.PUBLISH.getCode());
        ConverterUtil.copyPropertiesIgnoreNull(this, articleAgg);
        //初始文章热度
        Long hotValue = System.currentTimeMillis() / CommonConstant.HOT_VALUE_UNIT;
        ArticleDataDO articleDataDO = ArticleDataDO.builder().articleId(articleAgg.getId()).collectionAmount(0L).lookAmount(0L)
                .supportAmount(0L).commentAmount(0L).hotValue(hotValue).build();
        articleAgg.setArticleDataDO(articleDataDO);
        List<TagValue> tagValues = TagAssembler.INSTANCE.dtoToValue(tagDTOList);
        List<ColumnValue> columnValues = ColumnAssembler.INSTANCE.convert(columnDTOList);
        articleAgg.setTagValues(tagValues);
        articleAgg.setColumnValues(columnValues);
        articleAgg.setArticleAuthorId(currentUser.getId());
        articleAgg.setArticleAuthorName(currentUser.getNickname());
        return articleAgg;
    }

}
